package sv.com.globalsolutionslt.manejador;

import java.io.Serializable;
import java.util.Calendar;
import java.util.regex.Pattern;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.jasypt.util.password.BasicPasswordEncryptor;
import sv.com.globalsolutionslt.controlador.EmpresaFacade;
import sv.com.globalsolutionslt.controlador.EstadoEmpresaFacade;
import sv.com.globalsolutionslt.controlador.EstadoUsuarioFacade;
import sv.com.globalsolutionslt.controlador.RolFacade;
import sv.com.globalsolutionslt.controlador.UsuarioFacade;
import sv.com.globalsolutionslt.entidades.Empresa;
import sv.com.globalsolutionslt.entidades.Usuario;
import sv.com.globalsolutionslt.manejador.util.JsfUtil;

@ManagedBean
@SessionScoped
public class RegistroEmpresaMB implements Serializable {

    @EJB
    private UsuarioFacade usuarioFacade;
    @EJB
    private EstadoUsuarioFacade estadoUsuarioFacade;
    @EJB
    private EmpresaFacade empresaFacade;
    @EJB
    private RolFacade rolFacade;
    @EJB
    private EstadoEmpresaFacade estadoEmpresaFacade;

    private Usuario entidadUsuario;
    private Empresa empresa;
    private String confirContrasenia;
    private Pattern patron;
    private final String REGEX_PATRON_NOMBRE_USUARIO_VALIDO = "^[a-z0-9_.-]{6,20}$";

    public RegistroEmpresaMB() {
        empresa = new Empresa();
        entidadUsuario = new Usuario();
        patron = Pattern.compile(REGEX_PATRON_NOMBRE_USUARIO_VALIDO);

    }

    public String guardarEntidad() {
        try {
            if (!esClaveCorrecta()) {
                JsfUtil.agregarMensajeAdvertencia("La Clave no coincide con la confirmación");
                return "";
            }

            if (!estaValidoUsuario()) {
                JsfUtil.agregarMensajeAdvertencia("El usuario debe contener solamente letras minusculas, valores numericos y los siguientes caracteres -_.");
                JsfUtil.agregarMensajeAdvertencia("El usuario debe tener al menos 6 caracteres");
                return "";
            }

            this.entidadUsuario.setContrasenia(new BasicPasswordEncryptor().encryptPassword(getEntidadUsuario().getContrasenia()));
            this.entidadUsuario.setIdEstadoUsuario(estadoUsuarioFacade.obtenerEstadoUsuarioActivo());
            this.entidadUsuario.setIdRol(rolFacade.obtenerRol("EMPRESA"));
            this.empresa.setIdEstadoEmpresa(estadoEmpresaFacade.obtenerEstadoActivo());
            this.empresa.setIdUsuario(getEntidadUsuario());
            this.empresa.setFechaRegistro(Calendar.getInstance().getTime());
            this.empresaFacade.guardar(empresa);

            JsfUtil.agregarMensajeExitoso("Su registro ha sido completado exitosamente");
            JsfUtil.agregarMensajeExitoso("Inicie sesión para ingresar a su perfil");

            return "/sesionEmpresa";

        } catch (Exception e) {
            e.printStackTrace();
            JsfUtil.agregarMensajeError(e, JsfUtil.MENSAJE_ERROR_DEFECTO);
            return "";
        }
    }  
  
    private boolean esClaveCorrecta() {
        return getEntidadUsuario().getContrasenia().equals(getConfirContrasenia());
    }

    private boolean estaValidoUsuario() {
        return patron.matcher(this.entidadUsuario.getUsuario()).matches();
    }
    

    //********************** Getter and Setters*********************
    public Usuario getEntidadUsuario() {
        return entidadUsuario;
    }

    public void setEntidadUsuario(Usuario entidadUsuario) {
        this.entidadUsuario = entidadUsuario;
    }

    public String getConfirContrasenia() {
        return confirContrasenia;
    }

    public void setConfirContrasenia(String confirContrasenia) {
        this.confirContrasenia = confirContrasenia;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public UsuarioFacade getUsuarioFacade() {
        return usuarioFacade;
    }

    public void setUsuarioFacade(UsuarioFacade usuarioFacade) {
        this.usuarioFacade = usuarioFacade;
    }

    public EstadoUsuarioFacade getEstadoUsuarioFacade() {
        return estadoUsuarioFacade;
    }

    public void setEstadoUsuarioFacade(EstadoUsuarioFacade estadoUsuarioFacade) {
        this.estadoUsuarioFacade = estadoUsuarioFacade;
    }

    public EmpresaFacade getEmpresaFacade() {
        return empresaFacade;
    }

    public void setEmpresaFacade(EmpresaFacade empresaFacade) {
        this.empresaFacade = empresaFacade;
    }

    public RolFacade getRolFacade() {
        return rolFacade;
    }

    public void setRolFacade(RolFacade rolFacade) {
        this.rolFacade = rolFacade;
    }

    public EstadoEmpresaFacade getEstadoEmpresaFacade() {
        return estadoEmpresaFacade;
    }

    public void setEstadoEmpresaFacade(EstadoEmpresaFacade estadoEmpresaFacade) {
        this.estadoEmpresaFacade = estadoEmpresaFacade;
    } 

}
